package util;

import java.util.logging.Logger;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import model.MailInfo;

import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import exception.WaterCounterException;

/**
 * Класс осуществляет отпправку письма по электронной почте.
 * 
 * @author sergey.malahov
 */
public class ReportSender {

	private static final Logger log = Logger.getLogger(ReportSender.class
			.getName());

	private static final String ENCODING = "UTF-8";

	/**
	 * Приоритет письма; 1-максимальный, 5-минимальный.
	 */
	private static final int MAX_PRIORITY = 1;

	/**
	 * Запрашивать отчет о прочтении.
	 */
	private static final String SEND_READING_REPORT_TO = "Disposition-Notification-To";

	private JavaMailSenderImpl sender;

	private MailInfo mailInfo;

	public ReportSender(MailInfo mailInfo) {
		this.mailInfo = mailInfo;
		sender = new JavaMailSenderImpl();
		sender.setHost(mailInfo.getSmtpServer());
		sender.setPort(Integer.parseInt(mailInfo.getPort()));
		sender.setPassword(mailInfo.getPassword());
		sender.setUsername(mailInfo.getAccount());
		sender.setDefaultEncoding(ENCODING);
	}

	/**
	 * Создает и отправляет электронное письми.
	 * 
	 * @param message
	 *            Текст письма в формате HTML.
	 * @throws WaterCounterException
	 *             Если что то пошло не так.
	 */
	public void send(String message) throws WaterCounterException {
		MimeMessage mimeMessade = sender.createMimeMessage();
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessade, ENCODING);

		try {
			helper.setSubject("test water counter");
			helper.setText(message, true);
			helper.setTo(mailInfo.getRecipient());
			helper.setFrom(mailInfo.getAccount());
			helper.setPriority(MAX_PRIORITY);
			helper.setReplyTo(mailInfo.getAccount());
			helper.getMimeMessage().setHeader(SEND_READING_REPORT_TO,
					mailInfo.getAccount());
			sender.send(helper.getMimeMessage());
		} catch (MailException e) {
			log.severe(e.getMessage());
			throw new WaterCounterException(e);
		} catch (MessagingException e) {
			log.severe(e.getMessage());
			throw new WaterCounterException(e);
		}
	}
}
